home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / ada / gwuada_5.zip / adaed / spider / spider.adb < prev    next >
Text File  |  1993-02-04  |  8KB  |  298 lines

  1. WITH Text_IO;
  2. PACKAGE My_Int_IO IS NEW Text_IO.Integer_IO(Num => Integer);
  3.  
  4. WITH Text_IO;
  5. WITH Calendar;   -- standard Ada Package
  6. USE  Calendar;
  7. WITH My_Int_IO;
  8.  
  9. PACKAGE BODY Spider IS
  10. -- IMPLEMENTATION of Spider Graphics Package
  11. -- with no ANSI colors
  12. -- by John Dalbey December 1992
  13. -- contributed to the public domain.
  14. --
  15. Screen_Depth : CONSTANT Integer := 24;
  16. Screen_Width : CONSTANT Integer := 80;
  17.  
  18. TYPE Direction        IS (north,east,south,west);
  19. TYPE DirectionSymbols IS ARRAY (Direction) OF character;
  20. TYPE Palette          IS ARRAY (ScreenColors) OF character;
  21.  
  22. SUBTYPE Depth IS Integer RANGE 1..Screen_Depth;
  23. SUBTYPE Width IS Integer RANGE 1..Screen_Width;
  24.  
  25. Column       : width;                 -- spider's position
  26. Row          : depth;                      --      in the room.
  27. Heading      : Direction ;                  -- spider's direction
  28. Ink          : ScreenColors;                -- color being drawn
  29. DebugFlag    : boolean          := false;   -- Is single stepping on?
  30. RoomSize     : depth;                -- generated randomly
  31. RowHi        : depth := 22;          -- room upper boundary for row
  32. ColHi        : width := 40;          -- room upper boundary for column
  33.  
  34. Spidersym    : constant character := '*';   -- asterisk
  35. LoBound      : constant integer := 1;       -- room lower boundary
  36. WindowOffset : constant integer := 20;
  37. ColorSymbols : constant Palette := ('+','X','O','.'); -- ASCII symbols for color
  38. Compass      : constant DirectionSymbols := ('^','>','V','<');
  39.  
  40.   PROCEDURE MoveCursor (Row : Depth;Column : Width) IS
  41.   -- Move the cursor to a particular row and column on the screen.
  42.   BEGIN
  43.     Text_IO.Put (Item => ASCII.ESC);
  44.     Text_IO.Put ("[");
  45.     My_Int_IO.Put (Item => Row, Width => 1);
  46.     Text_IO.Put (Item => ';');
  47.     My_Int_IO.Put (Item => Column, Width => 1);
  48.     Text_IO.Put (Item => 'f');
  49.   END MoveCursor;  
  50.  
  51. PROCEDURE DrawStatus IS
  52. BEGIN
  53.     -- Draw Status Box in upper left corner showing current direction.
  54.     MoveCursor (1,1);
  55.     Text_IO.Put (" --- ");
  56.     MoveCursor (2,1);
  57.     Text_IO.Put ("|   |");
  58.     MoveCursor (3,1);
  59.     Text_IO.Put ("|   |");
  60.     MoveCursor (4,1);
  61.     Text_IO.Put (" --- ");
  62. END DrawStatus;
  63.  
  64. PROCEDURE DrawRoom  IS
  65. --  Draw the Spider's room (fixed size).
  66.   i: integer;
  67.   BEGIN
  68.     Text_IO.PUT (ASCII.ESC);
  69.     Text_IO.Put (Item => "[2J"); -- clear screen
  70.     MoveCursor (1,1);
  71.     -- Top Bar
  72.     Text_IO.Put ("                    ");
  73.     Text_IO.Put ("----------------------------------------- ");
  74.     Text_IO.New_Line;
  75.     FOR I in 1..21 LOOP
  76.     Text_IO.Put ("                   |");
  77.     Text_IO.Put (". . . . . . . . . . . . . . . . . . . . .|");
  78.     Text_IO.New_Line;
  79.     END LOOP;
  80.     Text_IO.Put ("                    ");
  81.     Text_IO.Put ("----------------------------------------- ");
  82.     DrawStatus;
  83.   END DrawRoom;
  84.  
  85.  
  86.   PROCEDURE DrawRoom (Size: depth) IS
  87.   --  Draw the Spider's room (variable size).
  88.   i: integer;
  89.   BEGIN
  90.     Text_IO.PUT (ASCII.ESC);
  91.     Text_IO.Put (Item => "[2J"); -- clear screen
  92.     MoveCursor (1,1);
  93.     -- Top Bar
  94.     Text_IO.Put ("                    ");
  95.     FOR i in 1..Size-1 LOOP
  96.        Text_IO.Put ("--");
  97.     END LOOP;
  98.     Text_IO.Put ("-");
  99.     Text_IO.New_Line;
  100.     -- Side Bars
  101.     FOR I in 1..Size LOOP
  102.        Text_IO.Put ("                   |");
  103.        FOR i in 1..Size-1 LOOP
  104.           Text_IO.Put (". ");
  105.        END LOOP;
  106.        Text_IO.Put (".|");
  107.        Text_IO.New_Line;
  108.     END LOOP;
  109.     -- Bottom Bar
  110.     Text_IO.Put ("                    ");
  111.     FOR i in 1..Size-1 LOOP
  112.        Text_IO.Put ("--");
  113.     END LOOP;
  114.     Text_IO.Put ("-");
  115.     DrawStatus;
  116.   END DrawRoom;
  117.  
  118. PROCEDURE ChgColor (NewColor : ScreenColors) IS
  119. -- Change the color the spider is using.
  120. BEGIN
  121.     Ink := NewColor;
  122.     MoveCursor (3,3);
  123.     Text_IO.Put (ColorSymbols(Ink));
  124. END ChgColor;
  125.  
  126. PROCEDURE ShowDirection IS
  127. -- Show the current direction
  128. BEGIN
  129.     MoveCursor(2,3);
  130.     Text_IO.Put (Compass(heading));
  131. END ShowDirection;
  132.  
  133. PROCEDURE ShowSpider IS
  134. -- Show the spider symbol
  135. BEGIN
  136.     MoveCursor (Row+1, Column+WindowOffset);
  137.     Text_IO.Put (SpiderSym);
  138.     MoveCursor (2,3);  -- HIdecursor
  139. END ShowSpider;
  140.  
  141. PROCEDURE Reset IS
  142. -- Create a fixed size room and reset the spider.
  143. BEGIN
  144.     DrawRoom;
  145.     Column := 21;
  146.     Row := 11;
  147.     Heading := south;
  148.     Green;
  149.     ShowSpider;
  150.     ShowDirection;
  151. END Reset;
  152.  
  153.   FUNCTION Random RETURN Integer IS 
  154.   -- RAndom number generator based on clock time.
  155.   Now: Time;
  156.   Yr: Year_Number;
  157.   Mo: Month_Number;
  158.   Dy: Day_Number;
  159.   Seconds: Day_Duration;       -- seconds past midnight
  160.   BEGIN
  161.      Now := Clock;
  162.      Split (Now, Yr, Mo, Dy, Seconds);
  163.      Return ( ABS INTEGER(Seconds) mod 1000) ;
  164.   END Random;
  165.  
  166. PROCEDURE Start IS
  167. -- Create a random sized room and reset the spider.
  168. BEGIN
  169.     RoomSize :=  (Random MOD (RowHi-1)) + 2;
  170.     DrawRoom(RoomSize);
  171.     Row := 1;
  172.     Column := 1;
  173.     RowHi := RoomSize;
  174.     ColHi := RoomSize*2-1;
  175.     Heading := east;
  176.     Green;
  177.     ShowSpider;
  178.     ShowDirection;
  179. END Start;
  180.  
  181. -- Color commands
  182. PROCEDURE Blue IS
  183. BEGIN
  184.     ChgColor (blue);
  185. END Blue;
  186. PROCEDURE Green IS
  187. BEGIN
  188.     ChgColor (green);
  189. END Green;
  190. PROCEDURE Red IS
  191. BEGIN
  192.     ChgColor (red);
  193. END Red;
  194. PROCEDURE Black IS
  195. BEGIN
  196.     ChgColor (black);
  197. END Black;
  198.  
  199.  
  200. PROCEDURE Step IS
  201. -- Take a step forward command.
  202. OB      : boolean := false;  -- out of bounds flag
  203. AnyThing: character;
  204.  
  205. Hit_The_Wall: exception;
  206.  
  207. BEGIN
  208.     -- put a block down where spider is standing
  209.     MoveCursor(Row+1,Column+WindowOffset);
  210.     Text_IO.Put (ColorSymbols (Ink) );
  211.  
  212.     -- Check for out of bounds
  213.     CASE heading IS
  214.       WHEN north => IF Row <= LoBound THEN OB := true; END IF;
  215.       WHEN east  => IF Column >= ColHi THEN OB := true; END IF;
  216.       WHEN south => IF Row >= RowHi THEN OB := true; END IF;
  217.       WHEN west  => IF Column <= LoBound THEN OB := true; END IF;
  218.     END CASE;
  219.  
  220.     -- If out of bounds raise and exception.
  221.     IF OB THEN
  222.       Text_IO.New_Line;
  223.       Quit; 
  224.       raise Hit_The_Wall;
  225.     END IF;
  226.  
  227.     -- change the location coordinates
  228.     CASE heading IS
  229.       WHEN north => Row := Row - 1;
  230.       WHEN east  => Column := Column + 2;
  231.       WHEN south => Row := Row + 1;
  232.       WHEN west  => Column := Column - 2;
  233.     END CASE;
  234.  
  235.     -- draw the spider in her new location
  236.     ShowSpider;
  237.     IF Debug THEN   -- if debug mode, wait for user to press return
  238.          WHILE NOT Text_IO.End_of_line LOOP
  239.             Text_IO.Get ( Anything );
  240.          END LOOP;
  241.          Text_IO.Skip_Line;
  242.     END IF;
  243. END Step;
  244.  
  245. PROCEDURE Turn IS
  246. -- Turn to the right command.
  247. BEGIN
  248.     IF Heading = Direction'Last THEN
  249.        Heading := Direction'First;
  250.     ELSE    Heading := Direction'succ (Heading);
  251.     END IF;
  252.     ShowDirection;
  253. END Turn;
  254.  
  255. FUNCTION AtWall return BOOLEAN IS
  256. -- RETURN True if spider is adjacent to and facing a wall.
  257. BEGIN
  258.     -- Check for out of bounds
  259.     CASE heading IS
  260.       WHEN north => return  Row <= LoBound;
  261.       WHEN east  => return  Column >= ColHi;
  262.       WHEN south => return  Row >= RowHi;
  263.       WHEN west  => return  Column <= LoBound;
  264.     END CASE;
  265. END AtWall;
  266.  
  267. PROCEDURE Quit IS
  268. -- Quit command.
  269. BEGIN
  270.     MoveCursor(24,1);
  271. END Quit;
  272.  
  273. PROCEDURE Debug (Setting: Switch) is
  274. -- Toggle debugging mode
  275. BEGIN
  276.    IF Setting = ON THEN
  277.        DebugFlag := true;
  278.        MoveCursor (10,1);
  279.        Text_io.Put ("-- DEBUG ON -- ");
  280.        Text_io.New_Line;
  281.        Text_IO.Put ("  Press Enter");
  282.    ELSE
  283.        DebugFlag := false;
  284.        MoveCursor (10,1);
  285.        Text_io.Put ("               ");
  286.        Text_io.New_Line;
  287.        Text_IO.Put ("             ");
  288.    END IF;
  289. END Debug;
  290.  
  291. FUNCTION Debug return boolean is
  292. BEGIN
  293.    Return DebugFlag;
  294. END Debug;
  295.  
  296. END Spider;
  297.  
  298.